package core

import (
	"fmt"
	"sync"
)

// 定义一个AOI地图的格子类型
type Grid struct {
	// 格子ID
	GId int
	// 格子左边的边界坐标
	MinX int
	// 格子右边的边界坐标
	MaxX int
	// 格子的上边的边界坐标
	MinY int
	// 格子的下边的边界坐标
	MaxY int
	// 当前格子内玩家或者物体成员的ID集合
	playerIds map[int]bool
	// 保护当前格子内玩家或者物体成员的ID集合的锁
	pIdLock sync.RWMutex
}

// 初始化当前的格子的方法
func NewGrid(gId int, minX int, maxX int, minY int, maxY int) *Grid {
	return &Grid{
		GId:       gId,
		MinX:      minX,
		MaxX:      maxX,
		MinY:      minY,
		MaxY:      maxY,
		playerIds: map[int]bool{},
	}
}

// 给格子添加一个玩家
func (g *Grid) Add(playerId int) {
	g.pIdLock.Lock()
	defer g.pIdLock.Unlock()
	g.playerIds[playerId] = true
}

// 从格子中删除一个玩家
func (g *Grid) Remove(playerId int) {
	g.pIdLock.Lock()
	defer g.pIdLock.Unlock()
	delete(g.playerIds, playerId)
}

// 得到当前格子的所有的玩家ID
func (g *Grid) GetPlayerIds() (playerIds []int) {
	g.pIdLock.RLock()
	defer g.pIdLock.RUnlock()

	for id, _ := range g.playerIds {
		playerIds = append(playerIds, id)
	}
	return
}

// 调试使用-打印格子的基本消息
func (g *Grid) String() string {
	return fmt.Sprintf("Grid id: %d, minX: %d, maxX: %d, minY:%d, maxY: %d, playerIds: %v",
		g.GId, g.MinX, g.MaxX, g.MinY, g.MaxY, g.playerIds)
}
